<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->
    
        <meta name="description" content="梯度下降法是一个最优化算法，通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一，虽然现在已经不具有实用性，但是许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的，最速下降法越接近目标值，步长越小，前进越慢。
中文名 梯度下降外文名 ste">
    

    <!--Author-->
    
        <meta name="author" content="wangduo">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="梯度下降(gradient descent)算法简介"/>
    

    <!--Open Graph Description-->
    

    <!--Open Graph Site Name-->
    <meta property="og:site_name" content="wangduo"/>

    <!--Type page-->
    
        <meta property="og:type" content="article" />
    

    <!--Page Cover-->
    

        <meta name="twitter:card" content="summary" />
    

    <!-- Title -->
    
    <title>梯度下降(gradient descent)算法简介 - wangduo</title>

    <!-- Bootstrap Core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/css/style.css">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet" />

    <!-- Google Analytics -->
    


    <!-- favicon -->
    
	
</head>


<body>

    <!-- Menu -->
    <!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">wangduo's blog</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                
                    <li>
                        <a href="/">
                            
                                Home
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/archives">
                            
                                Archives
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/tags">
                            
                                Tags
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/categories">
                            
                                Categories
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/about">
                            
                                About
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="https://github.com/wduo">
                            
                                <i class="fa fa-github fa-stack-2x"></i>
                            
                        </a>
                    </li>
                
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

    <!-- Main Content -->
    <!-- Page Header -->
<!-- Set your background image for this header in your post front-matter: cover -->

<header class="intro-header" style="background-image: url('.jpg')">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>梯度下降(gradient descent)算法简介</h1>
                    
                    <span class="meta">
                        <!-- Date and Author -->
                        
                            Posted by wangduo on
                        
                        
                            2017-04-23
                        
                    </span>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

            <!-- Tags and categories -->
           
                <div class="col-lg-4 col-lg-offset-2 col-md-5 col-md-offset-1 post-tags">
                    
                        


<a href="/tags/gradient-descent/">#gradient descent</a> <a href="/tags/Deep-learning/">#Deep learning</a>


                    
                </div>
                <div class="col-lg-4 col-md-5 post-categories">
                    
                        

<a href="/categories/Deep-learning/">Deep learning</a>

                    
                </div>
            

            <!-- Gallery -->
            

            <!-- Post Main Content -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <p><img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/1.png" alt=""></p>
<p>梯度下降法是一个最优化算法，通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一，虽然现在已经不具有实用性，但是许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的，最速下降法越接近目标值，步长越小，前进越慢。</p>
<p>中文名 梯度下降<br>外文名 steepest descent (gradient descent)<br>用于 求解非线性方程组<br>类型 最优化算法</p>
<h3 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h3><p>1 简介<br>2 求解过程<br>3 例子<br>4 缺点</p>
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>梯度下降法(gradient descent)是一个最优化算法，通常也称为最速下降法。<a href="http://ovu6dymqj.bkt.clouddn.com/20170423-post/5.png" target="_blank" rel="external">1</a></p>
<p>常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。</p>
<h3 id="求解过程"><a href="#求解过程" class="headerlink" title="求解过程"></a>求解过程</h3><p>顾名思义，梯度下降法的计算过程就是沿梯度下降的方向求解极小值（也可以沿梯度上升方向求解极大值）。</p>
<p>其迭代公式为 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/5.png" alt="">  ,其中  <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/6.png" alt=""> 代表梯度负方向，  <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/7.png" alt=""> 表示梯度方向上的搜索步长。梯度方向我们可以通过对函数求导得到，步长的确定比较麻烦，太大了的话可能会发散，太小收敛速度又太慢。一般确定步长的方法是由线性搜索算法来确定，即把下一个点的坐标看做是a<sub>k+1</sub>的函数，然后求满足f(a<sub>k+1</sub>)的最小值的 即可。</p>
<p>因为一般情况下，梯度向量为0的话说明是到了一个极值点，此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时，算法迭代的终止条件是梯度向量的幅值接近0即可，可以设置个非常小的常数阈值。</p>
<h3 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h3><p>举一个非常简单的例子，如求函数 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/5.png" alt=""> 的最小值。</p>
<p>利用梯度下降的方法解题步骤如下：</p>
<p>1、求梯度， <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/6.png" alt=""></p>
<p>2、向梯度相反的方向移动 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/7.png" alt=""> ，如下</p>
<p> <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/8.png" alt=""> ，其中， <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/9.png" alt=""> 为步长。如果步长足够小，则可以保证每一次迭代都在减小，但可能导致收敛太慢，如果步长太大，则不能保证每一次迭代都减少，也不能保证收敛。</p>
<p>3、循环迭代步骤2，直到 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/10.png" alt=""> 的值变化到使得 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/11.png" alt=""> 在两次迭代之间的差值足够小，比如0.00000001，也就是说，直到两次迭代计算出来的 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/11.png" alt=""> 基本没有变化，则说明此时 <img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/11.png" alt=""> 已经达到局部最小值了。</p>
<p>4、此时，输出 x ，这个 x 就是使得函数 f(x) 最小时的 x 的取值 。</p>
<p>MATLAB如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">%% 最速下降法图示</div><div class="line">% 设置步长为0.1，f_change为改变前后的y值变化，仅设置了一个退出条件。</div><div class="line">syms x;f=x^2;</div><div class="line">step=0.1;x=2;k=0;         %设置步长,初始值,迭代记录数</div><div class="line">f_change=x^2;             %初始化差值</div><div class="line">f_current=x^2;            %计算当前函数值</div><div class="line">ezplot(@(x,f)f-x.^2)       %画出函数图像</div><div class="line">axis([-2,2,-0.2,3])       %固定坐标轴</div><div class="line">hold on</div><div class="line">while f_change&gt;0.000000001                %设置条件，两次计算的值之差小于某个数，跳出循环</div><div class="line">    x=x-step*2*x;                         %-2*x为梯度反方向，step为步长，！最速下降法！</div><div class="line">    f_change = f_current - x^2;           %计算两次函数值之差</div><div class="line">    f_current = x^2 ;                     %重新计算当前的函数值</div><div class="line">    plot(x,f_current,&apos;ro&apos;,&apos;markersize&apos;,7) %标记当前的位置</div><div class="line">    drawnow;pause(0.2);</div><div class="line">    k=k+1;</div><div class="line">end</div><div class="line">hold off</div><div class="line">fprintf(&apos;在迭代%d次后找到函数最小值为%e，对应的x值为%e\n&apos;,k,x^2,x)</div></pre></td></tr></table></figure>
<p>梯度下降法处理一些复杂的非线性函数会出现问题，例如Rosenbrock函数：</p>
<p>其最小值在(x,y)=(1,1) 处，函数值为 f(x,y)=0。但是此函数具有狭窄弯曲的山谷，最小点 (x,y)=(1,1)就在这些山谷之中，并且谷底很平。优化过程是之字形的向极小值点靠近，速度非常缓慢。</p>
<p><img src="http://ovu6dymqj.bkt.clouddn.com/20170423-post/14.jpg" alt=""></p>
<h3 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h3><ul>
<li>靠近极小值时收敛速度减慢。</li>
<li>直线搜索时可能会产生一些问题。</li>
<li>可能会“之字形”地下降。</li>
</ul>
<h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><ol>
<li><a href="">维基百科</a> ．维基百科[引用日期2013-05-23]</li>
<li><a href="http://baike.baidu.com/item/梯度下降" target="_blank" rel="external">百度百科</a> ． <a href="http://baike.baidu.com/item/梯度下降" target="_blank" rel="external">http://baike.baidu.com/item/梯度下降</a></li>
</ol>


                
            </div>

            <!-- Comments -->
            
                <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                    


                </div>
            
        </div>
    </div>
</article>

    <!-- Footer -->
    <hr />

<!-- Footer -->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                    

                    

                    
                        <li>
                            <a href="https://github.com/wduo" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    

                    
                        <li>
                            <a href="mailto:wangduoo2017@163.com" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-envelope-o fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    
                </ul>
                <p class="copyright text-muted">&copy; 2017 wangduo<br></p>
                <p class="copyright text-muted">Original Theme <a target="_blank" href="http://startbootstrap.com/template-overviews/clean-blog/">Clean Blog</a> from <a href="http://startbootstrap.com/" target="_blank">Start Bootstrap</a></p>
                <p class="copyright text-muted">Adapted for <a target="_blank" href="https://hexo.io/">Hexo</a> by <a href="http://www.codeblocq.com/" target="_blank">Jonathan Klughertz</a></p>
            </div>
        </div>
    </div>
</footer>


    <!-- After footer scripts -->
    
<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Bootstrap -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Disqus Comments -->



</body>

</html>